package com.john.study.es.config.annotation;

import com.john.study.es.config.BooleanEnum;
import com.john.study.es.config.FieldDataTypeEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author jiangguangtao 2017/7/28.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface FieldMapping {
    /**
     * 映射的字段名称，默认为字段属性名
     * @return
     */
    String name() default "";
    /**
     * 字段类型，默认为文本类型的
     *
     * @return
     */
    FieldDataTypeEnum type() default FieldDataTypeEnum.TEXT;

    /**
     * 字段是否可搜索 默认为TRUE
     *
     * @return
     */
    BooleanEnum index() default BooleanEnum.DEFAULT;

    /**
     * 字段等级的查询提速值 默认为1.0
     *
     * @return
     */
    float boost() default -1.0f;

    /**
     * 日期字段默认的格式
     * <p>
     * 默认为 strict_date_optional_time||epoch_millis
     *
     * @return
     */
    String format() default "";

    /**
     * 是否忽略不合法的输入值
     * TRUE忽略， FALSE对错误的输入抛出异常，并拒绝整个文档
     * <p>
     * <p>date, geo_point 默认为FALSE</p>
     * <p>
     * <p>应用范围
     * date
     * </p>
     *
     * @return
     */
    BooleanEnum ignoreMalformed() default BooleanEnum.DEFAULT;

    /**
     * 刷新时是否提前加载次序
     * <p>默认为FALSE</p>
     * <p>经常用于汇总查询的字段建议设置为TRUE</p>
     *
     * @return
     */
    BooleanEnum eagerGlobalOrdinals() default BooleanEnum.DEFAULT;

    /**
     * 此字段是否可以使用内存内排序、汇总
     *
     * @return
     */
    BooleanEnum fielddata() default BooleanEnum.DEFAULT;

    /**
     * 当前字段的多字段映射配置，常用于配置一个字段的多种用途。
     * <p>比如字段“city”，原字段用于全文搜索，同时也用于排序和聚合的关键字列</p>
     * "properties": {
     * "city": {
     * "type": "text",
     * "fields": {
     * "raw": {
     * "type":  "keyword"
     * }
     * }
     * }
     * }
     * <p>
     * <p>m则使用时</p>
     * <p>GET my_index/_search
     * <p>{
     * "query": {
     * "match": {
     * "city": "york"
     * }
     * },
     * "sort": {
     * "city.raw": "asc"
     * },
     * "aggs": {
     * "Cities": {
     * "terms": {
     * "field": "city.raw"
     * }
     * }
     * }
     * }
     *
     * @return
     */
    FieldsItem[] fields() default {};

    /**
     * 文本字段的分析器，用于在索引构建阶段与搜索阶段使用的
     * <p>
     * 默认使用标准的分析器
     *
     * @return
     * @see #searchAnalyzer()
     */
    String analyzer() default "";

    /**
     * 专门指定的搜索阶段使用的分析器,如果未指定则使用analyzer指定的分析器
     *
     * @return
     * @see #analyzer()
     */
    String searchAnalyzer() default "";

    /**
     * 得分算法或者说是相似度算法
     * <p>BM25 es和Lucene默认使用的算法</p>
     * <p>classic  TF/IDF算法，也是es和Lucene默认的算法</p>
     * <p>boolean 如果不需要全文搜索排位，只需要简单的判断是否匹配可以使用此算法</p>
     *
     * @return
     */
    String similarity() default "";

    /**
     * 为查询打分时是否需要考虑字符串长度
     * 设置此项为TRUE会占用更多的磁盘存储空间
     *
     * @return
     */
    BooleanEnum norms() default BooleanEnum.DEFAULT;

    /**
     * 当前字段是否以多列形式存储，以便于之后的排序、聚合等使用
     * binary, date 字段默认为TRUE，
     *
     * @return
     */
    BooleanEnum docValues() default BooleanEnum.DEFAULT;

    /**
     * 指明此字段是否需要索引，默认为TRUE，
     * <P>如果一个字段只是用来存储数据的，那么可以特别指明不需要索引的字段。</P>
     *
     * @return
     */
    BooleanEnum enabled() default BooleanEnum.DEFAULT;
}
